package com.wing.user.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.iai.v20180301.IaiClient;
import com.tencentcloudapi.iai.v20180301.models.*;
import com.wing.common.exception.BusinessException;
import com.wing.common.utils.JsonResult;
import com.wing.user.dao.FaceRecognitionDao;
import com.wing.user.model.entity.FaceRecognition;
import com.wing.user.model.response.EnterpriseInfoVO;
import com.wing.user.utils.Base64Utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 人脸识别-ServiceImpl
 *
 * @author
 */

@Service
@Slf4j
public class FaceRecognitionServiceImpl extends ServiceImpl<FaceRecognitionDao, FaceRecognition> implements FaceRecognitionService {

    @Value("${tencent.face.id}")
    private String secretId;
    @Value("${tencent.face.key}")
    private String secretKey;

    @Value("${domain.name}")
    private String domainName;

    @Override
    public EnterpriseInfoVO getEnterpriseInfo() {
        return baseMapper.getEnterpriseInfo();
    }

    @Override
    public boolean updIsCreateFaceDatabase() {
        return baseMapper.updIsCreateFaceDatabase() > 0;
    }

    /*public static void main(String[] args){
        try {
            final String reqUri = "http://localhost:9300/oauth2/admin/user/login";
            JSONObject json = new JSONObject();
            json.put("grant_type", "password");
            json.put("scope", "web");
            json.put("client_id", "webApp");
            json.put("client_secret", "$2a$10$06msMGYRH8nrm4iVnKFNKOoddB8wOwymVhbUzw/d3ZixD7Nq8ot72");
            json.put("username", "A0001");
            json.put("password", "$2a$10$aIlECHFhkuz.dcBVJoc16u3PFQcM6FR2r15ek.aRJm3NC9lwev8Bu");
            String jsonObject = JSONObject.quote(json.toString());
            String tokenJson = HttpHelper.httpPost(reqUri, jsonObject);
            out.println(String.format("==========================>this is response:{%s}", tokenJson));
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }*/

    @Override
    public JsonResult createGroup(String groupId, String groupName) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential(secretId, secretKey);
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            IaiClient client = new IaiClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            CreateGroupRequest req = new CreateGroupRequest();
            req.setGroupName(groupName);
            req.setGroupId(groupId);
            // 返回的resp是一个CreateGroupResponse的实例，与请求对象对应
            CreateGroupResponse resp = null;
            resp = client.CreateGroup(req);
            // 输出json格式的字符串回包
            System.out.println(CreateGroupResponse.toJsonString(resp));
            return JsonResult.success();
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
            log.error("create group fail", e);
//            return false;
            return JsonResult.fail(e.getMessage());
        }
//        return true;
    }

    @Override
    public boolean GetGroupInfo(String groupId) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential(secretId, secretKey);
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            IaiClient client = new IaiClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            GetGroupInfoRequest req = new GetGroupInfoRequest();
            req.setGroupId(groupId);
            // 返回的resp是一个GetGroupInfoResponse的实例，与请求对象对应
            GetGroupInfoResponse resp = client.GetGroupInfo(req);
            // 输出json格式的字符串回包
            System.out.println(GetGroupInfoResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
            log.info("get group info fail", e);
        }
        return false;
    }

    @Override
    public JsonResult CreatePerson(String groupId, String personName, String personId, String url) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential(secretId, secretKey);
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            IaiClient client = new IaiClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            CreatePersonRequest req = new CreatePersonRequest();
            req.setGroupId(groupId);
            req.setPersonName(personName);
            req.setPersonId(personId);
//            req.setUrl(url);
            req.setImage(Base64Utils.imageUrlToBase64(url));
//            req.setImage(Base64Utils.picToBase64(url));
            /** UniquePersonControl
             * 此参数用于控制判断 Image 或 Url 中图片包含的人脸，是否在人员库中已有疑似的同一人。
             * 如果判断为已有相同人在人员库中，则不会创建新的人员，返回疑似同一人的人员信息。
             * 如果判断没有，则完成创建人员。
             * 0: 不进行判断，无论是否有疑似同一人在库中均完成入库；
             * 1:较低的同一人判断要求（百一误识别率）；
             * 2: 一般的同一人判断要求（千一误识别率）；
             * 3: 较高的同一人判断要求（万一误识别率）；
             * 4: 很高的同一人判断要求（十万一误识别率）。
             * 默认 0。
             * 注： 要求越高，则疑似同一人的概率越小。不同要求对应的误识别率仅为参考值，您可以根据实际情况调整。
             */
            req.setUniquePersonControl(4l);
            // 返回的resp是一个CreatePersonResponse的实例，与请求对象对应
            CreatePersonResponse resp = client.CreatePerson(req);
            // 输出json格式的字符串回包
            System.out.println(CreatePersonResponse.toJsonString(resp));
            return JsonResult.success();
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
            log.error("create user fail", e);
//            throw new BusinessException(500, e.toString());
            return JsonResult.fail(e.getMessage());
        }
    }

    @Override
    public JsonResult DeletePersonFromGroup(String groupId, String personId) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential(secretId, secretKey);
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            IaiClient client = new IaiClient(cred, "ap-nanjing", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            DeletePersonFromGroupRequest req = new DeletePersonFromGroupRequest();

            req.setPersonId(personId);
            req.setGroupId(groupId);
            // 返回的resp是一个DeletePersonResponse的实例，与请求对象对应
            DeletePersonFromGroupResponse resp = client.DeletePersonFromGroup(req);
            // 输出json格式的字符串回包
            System.out.println(DeletePersonResponse.toJsonString(resp));
            return JsonResult.success();
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
            log.error("del user from group fail", e);
            return JsonResult.fail(e.getMessage());
        }
    }

    @Override
    public JsonResult searchFaces(String[] groupIds, String image) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential(secretId, secretKey);
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            IaiClient client = new IaiClient(cred, "ap-nanjing", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SearchFacesRequest req = new SearchFacesRequest();
            req.setGroupIds(groupIds);
            req.setImage(image);
            SearchFacesResponse resp = client.SearchFaces(req);
            // 输出json格式的字符串回包
            System.out.println(SearchFacesResponse.toJsonString(resp));
            return JsonResult.success();
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
            log.error("search face from group fail", e);
            return JsonResult.fail(e.getMessage());
        }
    }

    public static void main(String[] args) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential("AKIDXtzoMefPs51g4pJWS7VcRzGGzRbU7TYN", "Zrsb3E8k59wReaGelbASTCepiKehTxA6");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            IaiClient client = new IaiClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            CreateGroupRequest req = new CreateGroupRequest();
            req.setGroupName("湖南城聚科技");
            req.setGroupId("100");
            // 返回的resp是一个CreateGroupResponse的实例，与请求对象对应
            CreateGroupResponse resp = null;
            resp = client.CreateGroup(req);
            // 输出json格式的字符串回包
            System.out.println(CreateGroupResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
            System.out.println(e);
            System.out.println(e.getMessage());
        }


        /*try{
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential("AKIDXtzoMefPs51g4pJWS7VcRzGGzRbU7TYN", "Zrsb3E8k59wReaGelbASTCepiKehTxA6");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            IaiClient client = new IaiClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            CreatePersonRequest req = new CreatePersonRequest();
            req.setGroupId("001");
            req.setPersonName("云端科技");
            req.setPersonId(personId);
            req.setUrl(url);
            *//** UniquePersonControl
         * 此参数用于控制判断 Image 或 Url 中图片包含的人脸，是否在人员库中已有疑似的同一人。
         * 如果判断为已有相同人在人员库中，则不会创建新的人员，返回疑似同一人的人员信息。
         * 如果判断没有，则完成创建人员。
         * 0: 不进行判断，无论是否有疑似同一人在库中均完成入库；
         * 1:较低的同一人判断要求（百一误识别率）；
         * 2: 一般的同一人判断要求（千一误识别率）；
         * 3: 较高的同一人判断要求（万一误识别率）；
         * 4: 很高的同一人判断要求（十万一误识别率）。
         * 默认 0。
         * 注： 要求越高，则疑似同一人的概率越小。不同要求对应的误识别率仅为参考值，您可以根据实际情况调整。
         *//*
            req.setUniquePersonControl(4l);
            // 返回的resp是一个CreatePersonResponse的实例，与请求对象对应
            CreatePersonResponse resp = client.CreatePerson(req);
            // 输出json格式的字符串回包
            System.out.println(CreatePersonResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }*/

        /*try{
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential("AKIDXtzoMefPs51g4pJWS7VcRzGGzRbU7TYN", "Zrsb3E8k59wReaGelbASTCepiKehTxA6");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            IaiClient client = new IaiClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            CreateGroupRequest req = new CreateGroupRequest();
            req.setGroupName("云端科技");
            req.setGroupId("001");
            // 返回的resp是一个CreateGroupResponse的实例，与请求对象对应
            CreateGroupResponse resp = null;
            resp = client.CreateGroup(req);
            // 输出json格式的字符串回包
            System.out.println(CreateGroupResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }*/


        /*try{
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential("AKIDXtzoMefPs51g4pJWS7VcRzGGzRbU7TYN", "Zrsb3E8k59wReaGelbASTCepiKehTxA6");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            IaiClient client = new IaiClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            CreatePersonRequest req = new CreatePersonRequest();
            req.setGroupId("001");
            req.setPersonName("登峰");
//            req.setPersonId(personId);
//            req.setUrl(url);
            req.setImage(Base64Utils.imageUrlToBase64("https://cjdata-ccjr.oss-cn-hangzhou.aliyuncs.com/4d5b9f8e-002b-47a5-be1a-c13ebad2e4a3.jpg"));
            *//** UniquePersonControl
         * 此参数用于控制判断 Image 或 Url 中图片包含的人脸，是否在人员库中已有疑似的同一人。
         * 如果判断为已有相同人在人员库中，则不会创建新的人员，返回疑似同一人的人员信息。
         * 如果判断没有，则完成创建人员。
         * 0: 不进行判断，无论是否有疑似同一人在库中均完成入库；
         * 1:较低的同一人判断要求（百一误识别率）；
         * 2: 一般的同一人判断要求（千一误识别率）；
         * 3: 较高的同一人判断要求（万一误识别率）；
         * 4: 很高的同一人判断要求（十万一误识别率）。
         * 默认 0。
         * 注： 要求越高，则疑似同一人的概率越小。不同要求对应的误识别率仅为参考值，您可以根据实际情况调整。
         *//*
            req.setUniquePersonControl(4l);
            // 返回的resp是一个CreatePersonResponse的实例，与请求对象对应
            CreatePersonResponse resp = client.CreatePerson(req);
            // 输出json格式的字符串回包
            System.out.println(CreatePersonResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }*/

    }

}
